/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package programa;

import org.antlr.runtime.*;

/**
 *
 * @author Gabriel, Lucas, Rodrigo
 */
public class SimpleToken extends CommonToken {

    /* tipos de token */
    //EOF herdado de CommonToken
    public static final int PALAVRA_RESERVADA = 1;
    public static final int SIMBOLO_RESERVADO = 2;
    public static final int IDENTIFICADOR = 3;
    public static final int NUMERO_INTEIRO = 4;
    public static final int NUMERO_REAL = 5;
    public static final int CADEIA_LITERAL = 6;
    public static final int COMENTARIO = 7;
    public static final int ESPACO_BRANCO = 8;
    public static final int ERRO = 9;
    public static final int ERRO2 = 10;

    public SimpleToken(Token t) {
        super(t);
    }

    public SimpleToken(int type, String text) {
        super(type, text);
    }

    //retorna texto da categoria do token
    public String getTypeText() {
        switch (this.type) {
            case EOF: //herdado de CommonToken
                return "EOF";
            case PALAVRA_RESERVADA:
            case SIMBOLO_RESERVADO:
                return this.text;
            case IDENTIFICADOR:
                return "identificador";
            case NUMERO_INTEIRO:
                return "numero_inteiro";
            case NUMERO_REAL:
                return "numero_real";
            case CADEIA_LITERAL:
                return "cadeia_literal";
            case COMENTARIO:
            case ESPACO_BRANCO:
                return "";
            case ERRO:
                return "simbolo nao identificado";
            case ERRO2:
                return "comentario nao fechado";
            default:
                return "null";
        }
    }

    /*
     * Os overrides dos métodos 'equals' e 'hashCode' servem para o método 'contains' 
     * da classe ArrayList utilizar o atributo hashCode como critério de avaliação
     * ao invés de utilizar a referência do objeto
     */
    @Override
    public boolean equals(Object o) {
        if (this.getClass().equals(o.getClass())) {
            if (this.hashCode() == o.hashCode()) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return (this.text != null ? this.text.hashCode() : 0);
    }

    @Override
    public String toString() {
        switch (this.type) {
            case COMENTARIO:
            case ESPACO_BRANCO:
                return "";
            case ERRO:
                return "Linha " + this.getLine() + ": " + this.getText() + " - " + this.getTypeText();
            case ERRO2:
                return "Linha " + this.getLine() + ": " + this.getTypeText();
            default:
                return this.getText() + " - " + this.getTypeText();
        }
    }
}
